home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / tools / has060 / hassrc87.lzh / macro.s < prev    next >
Text File  |  1999-10-08  |  30KB  |  1,215 lines

  1. ;----------------------------------------------------------------
  2. ;    X68k High-speed Assembler
  3. ;        マクロ展開処理
  4. ;        < macro.s >
  5. ;
  6. ;    $Id: macro.s,v 2.2  1999 10/ 8(Fri) 21:51:41 M.Kamada Exp $
  7. ;
  8. ;        Copyright 1990-94  by Y.Nakamura
  9. ;                  1997-99  by M.Kamada
  10. ;----------------------------------------------------------------
  11.  
  12.     .include    has.equ
  13.     .include    cputype.equ
  14.     .include    register.equ
  15.     .include    tmpcode.equ
  16.     .include    symbol.equ
  17.  
  18.     .cpu    68000
  19.     .text
  20.  
  21.  
  22. ;----------------------------------------------------------------
  23. ;    マクロ定義疑似命令のアセンブル処理
  24. ;----------------------------------------------------------------
  25.  
  26. ;----------------------------------------------------------------
  27. ;    <シンボル>    macro    [<仮引数リスト>]
  28. ~~macro::
  29.     move.b    (a0),d0
  30.     cmp.b    #'*',d0
  31.     beq    ~~macro1
  32.     cmp.b    #';',d0            ;拡張モードのコメント
  33.     bne    ~~macro2
  34. ~~macro1:                ;仮引数リストの位置にコメントがあった場合
  35.     tst.b    (a0)+
  36.     bne    ~~macro1
  37.     subq.l    #1,a0
  38.     move.l    a0,(LINEPTR,a6)
  39. ~~macro2:
  40.     move.w    (LABNAMELEN,a6),d1
  41.     bmi    nosymerr_macro        ;マクロ名がない
  42.     move.w    #-1,(LABNAMELEN,a6)    ;定義するのでラベルを取り消す
  43.     movea.l    (LABNAMEPTR,a6),a0
  44.     bsr    isdefdmac
  45.     tst.w    d0
  46.     beq    ~~macro5
  47.     bsr    defmacsymbol        ;新しく登録する
  48. ~~macro5:
  49.     move.w    #T_MACDEF,d0
  50.     bsr    wrtobjd0w
  51.     move.l    a1,d0            ;シンボルへのポインタ
  52.     bsr    wrtd0l
  53.     move.l    (TEMPPTR,a6),d0
  54.     bsr    wrtd0l            ;定義内容へのポインタ
  55.     move.l    d0,(SYM_DEFINE,a1)
  56.     move.l    a1,(MACSYMPTR,a6)
  57.     movea.l    (LINEPTR,a6),a0
  58.     lea.l    (LOCSYMBUF,a6),a1    ;(マクロ仮引数リスト登録バッファ)
  59.     bsr    defpara            ;マクロ仮引数リストの登録
  60.     move.l    a1,(MACDEFEND,a6)
  61.     clr.w    (MACLOCSNO,a6)
  62.     clr.b    (MACMODE,a6)        ;定義するのはマクロ
  63.     bra    defmacro        ;マクロ定義のメインルーチンへ
  64.  
  65. ;----------------------------------------------------------------
  66. ;    exitm
  67. ~~exitm::
  68.     tst.w    (MACNEST,a6)
  69.     beq    mismacerr_exitm        ;マクロ展開中でなければエラー
  70.     move.w    #T_EXITM,d0
  71.     bsr    wrtobjd0w
  72.     bra    macexexitm        ;展開中のマクロを終了させる
  73.  
  74. ;----------------------------------------------------------------
  75. ;    endm
  76. ~~endm::                ;(~~endm != ~~localにする)
  77.     bra    mismacerr_endm        ;マクロ定義ルーチン外ではエラー
  78.  
  79. ;----------------------------------------------------------------
  80. ;    local    <シンボル>[,<シンボル>,…]
  81. ~~local::
  82.     bra    mismacerr_local        ;マクロ定義ルーチン外ではエラー
  83.  
  84. ;----------------------------------------------------------------
  85. ;    sizem    <シンボル>
  86. ~~sizem::
  87.     bra    mismacerr_sizem        ;マクロ定義ルーチン外ではエラー
  88.  
  89.  
  90. ;----------------------------------------------------------------
  91. ;    拡張疑似命令のアセンブル処理
  92. ;----------------------------------------------------------------
  93.  
  94. ;----------------------------------------------------------------
  95. ;    .rept    <式>
  96. ~~rept::
  97.     bsr    deflabel        ;行頭にラベルがあったら定義しておく
  98.     bsr    calcconst
  99.     tst.l    d1            ;繰り返し回数(1~65535回)
  100.     beq    ~~reptskip
  101.     cmp.l    #$10000,d1
  102.     bcc    ilvalueerr
  103.     move.l    (TEMPPTR,a6),-(sp)
  104.     move.w    d1,-(sp)
  105.     move.b    #-1,(MACMODE,a6)
  106.     bsr    defmacro        ;繰り返す行の内容を読み込む
  107.     move.w    #T_REPT,d0
  108.     bsr    wrtobjd0w
  109.     move.w    (sp),d0            ;繰り返し回数
  110.     bsr    wrtd0w
  111.     move.l    (2,sp),d0        ;繰り返し内容へのポインタ
  112.     bsr    wrtd0l
  113.     move.w    (sp)+,d0
  114.     move.l    (sp)+,a0
  115.     suba.l    a1,a1
  116.     bra    exmacsetup        ;次の行からrept開始
  117.  
  118. ~~reptskip:                ;0回の繰り返し→繰り返し行をスキップする
  119.     move.b    #-1,(MACMODE,a6)
  120.     bra    defmacro        ;繰り返す行の内容を読み込む
  121.  
  122. ;----------------------------------------------------------------
  123. ;    .irp    <仮引数>,<実引数>[,<実引数>…]
  124. ~~irp0:
  125.     tst.b    (a0)
  126.     beq    iloprerr        ;引数がない
  127.     lea.l    (LOCSYMBUF,a6),a1    ;(仮引数リスト登録バッファ)
  128.     st.b    (a1)+            ;$FF $00 $01
  129.     sf.b    (a1)+
  130.     move.b    #$01,(a1)+
  131.     bsr    getpara            ;仮引数を得る
  132.     clr.b    (a1)
  133.     tst.w    d0
  134.     beq    ~~irp00            ;実引数がない
  135.     moveq.l    #0,d1
  136.     movea.l    (TEMPPTR,a6),a1
  137.     rts
  138.  
  139. ~~irp00:
  140.     addq.l    #4,sp            ;(スタック補正)
  141.     bra    ~~reptskip
  142.  
  143. ~~irp::
  144.     bsr    deflabel        ;行頭にラベルがあったら定義しておく
  145.     bsr    ~~irp0            ;仮引数を得る
  146.     move.l    a1,-(sp)
  147. ~~irp1:
  148.     addq.w    #1,d1
  149.     bsr    getmacpara        ;実引数リストを得る
  150.     tst.w    d0
  151.     bne    ~~irp1
  152. ~~irp2:
  153.     move.l    a1,(TEMPPTR,a6)
  154.     move.l    a1,-(sp)
  155.     move.w    d1,-(sp)        ;実引数の数
  156.     move.b    #1,(MACMODE,a6)
  157.     bsr    defmacro        ;繰り返す行の内容を読み込む
  158.     move.w    #T_IRP,d0
  159.     bsr    wrtobjd0w
  160.     move.w    (sp),d0            ;繰り返し回数
  161.     bsr    wrtd0w
  162.     move.l    (6,sp),d0        ;実引数リストへのポインタ
  163.     bsr    wrtd0l
  164.     move.l    (2,sp),d0        ;繰り返し内容へのポインタ
  165.     bsr    wrtd0l
  166.     move.w    (sp)+,d0
  167.     movea.l    (sp)+,a0
  168.     movea.l    (sp)+,a1
  169.     bra    exmacsetup        ;次の行からirp/irpc開始
  170.  
  171. ;----------------------------------------------------------------
  172. ;    .irpc    <仮引数>,<文字列>
  173. ~~irpc::
  174.     bsr    deflabel        ;行頭にラベルがあったら定義しておく
  175.     bsr    ~~irp0
  176.     move.l    a1,-(sp)
  177.  
  178.     moveq.l    #0,d1
  179.     move.b    (a0)+,d2
  180.     cmp.b    #'"',d2
  181.     beq    ~~irpc1
  182.     cmp.b    #"'",d2
  183.     beq    ~~irpc1
  184.     moveq.l    #0,d2
  185.     subq.l    #1,a0
  186. ~~irpc1:                ;実引数文字列を文字ごとに分解する
  187.     move.b    (a0)+,d0
  188.     bmi    ~~irpc3
  189.     beq    ~~irpc8
  190.     cmp.b    d0,d2
  191.     beq    ~~irpc9
  192.     tst.b    d2
  193.     bne    ~~irpc2            ;('~' / "~" に囲まれたスペースは実引数)
  194.     cmp.b    #' ',d0
  195.     bls    ~~irpc9
  196. ~~irpc2:
  197.     move.b    d0,(a1)+
  198.     clr.b    (a1)+
  199.     addq.w    #1,d1
  200.     bra    ~~irpc1
  201.  
  202. ~~irpc3:
  203.   .if EUCSRC=0
  204.     cmp.b    #$E0,d0
  205.     bcc    ~~irpc4
  206.     cmp.b    #$A0,d0
  207.     bcc    ~~irpc2            ;半角カタカナ
  208.   .else
  209.     bra    ~~irpc2            ;EUC
  210.   .endif
  211. ~~irpc4:                ;2バイト文字
  212.     addq.w    #1,d1
  213.     move.b    d0,(a1)+
  214.     move.b    (a0)+,(a1)+        ;2バイト文字の2バイト目
  215.     beq    ~~irpc8
  216.     clr.b    (a1)+
  217.     bra    ~~irpc1
  218.  
  219. ~~irpc8:
  220.     tst.b    d2
  221.     bne    ~~irpc91
  222. ~~irpc9:
  223.     tst.w    d1
  224.     beq    ~~irp00            ;実引数がない
  225.     bra    ~~irp2
  226.  
  227. ~~irpc91:
  228. ;'~'や"~"が閉じていない
  229.     cmp.b    #"'",d2
  230.     beq    termerr_singlequote
  231.     bra    termerr_doublequote
  232.  
  233.  
  234. ;----------------------------------------------------------------
  235. ;    マクロ/rept/irp/irpc命令の登録処理
  236. ;----------------------------------------------------------------
  237. ;マクロのサイズ指定を格納するローカルシンボルを.sizem疑似命令で登録.
  238. ;.sizemは.localとほぼ同じで,マクロの内部で使用可能,更新も可能.
  239. ;マクロ登録の時点で.sizemをローカルシンボル番号$FFFFで登録.
  240. ;マクロ展開の時点で.sizemのローカルシンボルがあればそこにサイズを格納する.
  241. ;マクロの引数の個数を登録するローカルシンボルのローカルシンボル番号は$FFFE
  242. defmacro:
  243.     move.w    #T_MDEFBGN,d0        ;マクロ等定義開始
  244.     bsr    wrtobjd0w
  245.     st.b    (ISIFSKIP,a6)        ;エラーチェック等はしない
  246.     st.b    (ISMACDEF,a6)
  247.     clr.w    (REPTSKIPNEST,a6)
  248. defmacro1:
  249.     bsr    getline            ;1行読み込み
  250.     tst.w    d0
  251.     bmi    defmacro9        ;定義中にソースが終了してしまった
  252.     or.w    #T_LINE,d0        ;1行開始
  253.     bsr    wrtobjd0w
  254.     bsr    encodeline        ;ラベルの処理と命令のコード化
  255.     tst.b    (ISMACRO,a6)
  256.     bne    defmacro2        ;マクロ命令
  257.     move.l    (CMDTBLPTR,a6),d0
  258.     beq    defmacro2        ;命令がない
  259.     movea.l    d0,a1
  260.     move.l    (SYM_FUNC,a1),a1
  261.     lea.l    (~~macro,pc),a2
  262.     cmpa.l    a1,a2
  263.     beq    defmacnest
  264.     lea.l    (~~endm,pc),a2
  265.     cmpa.l    a1,a2
  266.     beq    defmacend
  267.     lea.l    (~~local,pc),a2
  268.     cmpa.l    a1,a2
  269.     beq    defmaclocal
  270.     lea.l    (~~sizem,pc),a2
  271.     cmpa.l    a1,a2
  272.     beq    defmacsizem
  273.     lea.l    (~~rept,pc),a2
  274.     cmpa.l    a1,a2
  275.     beq    defmacnest
  276.     lea.l    (~~irp,pc),a2
  277.     cmpa.l    a1,a2
  278.     beq    defmacnest
  279.     lea.l    (~~irpc,pc),a2
  280.     cmpa.l    a1,a2
  281.     beq    defmacnest
  282. defmacro2:
  283.     bsr    defmacline        ;マクロ行1行のコード置換・登録
  284.     bra    defmacro1
  285.  
  286. ;----------------------------------------------------------------
  287. ;    定義中にソースが終了してしまった
  288. defmacro9:
  289.     st.b    (ISASMEND,a6)        ;処理を強制終了させる
  290. defmacro99:
  291.     move.w    #T_MDEFEND,d0        ;マクロ等定義終了
  292.     bsr    wrtobjd0w
  293.     sf.b    (ISIFSKIP,a6)
  294.     sf.b    (ISMACDEF,a6)
  295.     bra    mismacerr_eof
  296.  
  297. ;----------------------------------------------------------------
  298. ;    macro/rept/irp/irpcによる定義のネスト
  299. defmacnest:
  300. ;REPTSKIPNESTを増やす前にネストの開始行を展開しておかないと,
  301. ;ネストの開始行にローカルラベルがあったときに困る
  302.     bsr    defmacline        ;マクロ行1行のコード置換・登録
  303.     addq.w    #1,(REPTSKIPNEST,a6)
  304.     bra    defmacro1
  305.  
  306. ;----------------------------------------------------------------
  307. ;    endm
  308. defmacend:
  309.     subq.w    #1,(REPTSKIPNEST,a6)
  310.     bcc    defmacro2        ;ネスティングしているreptに対応するendm
  311. defmacend1:
  312.     movea.l    (TEMPPTR,a6),a0
  313.     st.b    (a0)+            ;終了コード $FF $00 $00
  314.     sf.b    (a0)+
  315.     sf.b    (a0)+
  316.     move.l    a0,(TEMPPTR,a6)
  317.     sf.b    (ISIFSKIP,a6)
  318.     tst.b    (MACMODE,a6)
  319.     bne    defmacend9        ;rept/irp/irpc定義の場合
  320.     movea.l    (MACSYMPTR,a6),a0
  321.     move.w    (MACLOCSNO,a6),(SYM_MACLOCS,a0)    ;ローカルシンボルの数
  322. defmacend9:
  323.     move.w    #-1,(LABNAMELEN,a6)    ;endm行にラベルがあったら無視する
  324.     move.w    #T_MDEFEND,d0        ;マクロ等定義終了
  325.     bsr    wrtobjd0w
  326.     sf.b    (ISMACDEF,a6)
  327.     rts
  328.  
  329. ;----------------------------------------------------------------
  330. ;    local    <シンボル>[,<シンボル>,…]
  331. defmaclocal:
  332.     tst.b    (MACMODE,a6)
  333.     bne    defmacro2        ;rept/irp/irpc登録中は無視
  334.     movea.l    (LINEPTR,a6),a0
  335.     movea.l    (MACDEFEND,a6),a1
  336.     move.l    a6,d0
  337.     add.l    #LOCSYMBUF+LOCSYMBUFSIZE,d0
  338.     cmpa.l    d0,a1
  339.     bcc    defmac_locsymover
  340.     tst.b    (a0)
  341.     beq    defmaclocal9        ;引数リストがない
  342. defmaclocal1:
  343.     move.b    #$FE,(a1)+        ;(ローカルシンボルマーク)
  344.     addq.w    #1,(MACLOCSNO,a6)
  345.     move.b    (MACLOCSNO,a6),(a1)+    ;high
  346.     move.b    (MACLOCSNO+1,a6),(a1)+    ;low
  347.     bsr    getpara            ;$FE [ローカルシンボル番号high,low] パラメータ名~ $00
  348.     tst.w    d0
  349.     bne    defmaclocal1
  350. defmaclocal9:
  351.     clr.b    (a1)
  352.     move.l    a1,(MACDEFEND,a6)
  353.     bra    defmacro1
  354.  
  355. ;----------------------------------------------------------------
  356. ;1つのマクロの中のローカルシンボルが多すぎて登録できないとき
  357. defmac_locsymover:
  358.     st.b    (ISASMEND,a6)        ;処理を強制終了させる
  359.     move.w    #T_MDEFEND,d0        ;マクロ等定義終了
  360.     bsr    wrtobjd0w
  361.     sf.b    (ISIFSKIP,a6)
  362.     sf.b    (ISMACDEF,a6)
  363.     bra    toomanylocsymerr
  364.  
  365. ;----------------------------------------------------------------
  366. ;    sizem    <シンボル>
  367. defmacsizem:
  368.     tst.b    (MACMODE,a6)
  369.     bne    defmacro2        ;rept/irp/irpc登録中は無視
  370.     movea.l    (LINEPTR,a6),a0
  371.     movea.l    (MACDEFEND,a6),a1
  372.     move.l    a6,d0
  373.     add.l    #LOCSYMBUF+LOCSYMBUFSIZE,d0
  374.     cmpa.l    d0,a1
  375.     bcc    defmac_locsymover
  376.     tst.b    (a0)
  377.     beq    defmacsizem9        ;引数リストがない
  378.     move.b    #$FE,(a1)+        ;(ローカルシンボルマーク)
  379. ;.sizemのシンボルは??xxxxにならないのでMACLOCSNO(a6)を増やさなくてよい
  380.     st.b    (a1)+            ;サイズ用のローカルシンボル
  381.     st.b    (a1)+
  382.     bsr    getpara            ;$FE $FF $FF パラメータ名~ $00
  383.     tst.w    d0
  384.     beq    defmacsizem8        ;第2引数がない
  385.     move.b    #$FE,(a1)+        ;(ローカルシンボルマーク)
  386. ;.sizemのシンボルは??xxxxにならないのでMACLOCSNO(a6)を増やさなくてよい
  387.     st.b    (a1)+            ;引数の個数用のローカルシンボル
  388.     move.b    #$FE,(a1)+
  389.     bsr    getpara            ;$FE $FF $FE パラメータ名~ $00
  390. defmacsizem8:
  391.                     ;余計なパラメータは無視する
  392. defmacsizem9:
  393.     clr.b    (a1)
  394.     move.l    a1,(MACDEFEND,a6)
  395.     bra    defmacro1
  396.  
  397. ;----------------------------------------------------------------
  398. ;    マクロ行1行のコード置換・登録
  399. defmacline:
  400.     lea.l    (LINEBUF,a6),a0
  401.     movea.l    (TEMPPTR,a6),a2
  402.     tst.b    (MACMODE,a6)
  403.     bpl    defmacline1
  404. defmacline0:
  405.     move.b    (a0)+,(a2)+        ;rept登録中なら行の内容を転送するのみ
  406.     bne    defmacline0
  407.     move.l    a2,(TEMPPTR,a6)
  408.     bra    memcheck
  409.  
  410. defmacline1:
  411.     move.b    (a0),d0
  412.     beq    defmacline9        ;行が終了した
  413.     cmp.b    #"'",d0
  414.     beq    defmacstr
  415.     cmp.b    #'"',d0
  416.     beq    defmacstr
  417.     cmp.b    #'&',d0
  418.     bne    defmacline2
  419.     addq.l    #1,a0
  420.     cmp.b    #'&',(a0)
  421.     bne    defmacline1
  422.     move.b    (a0)+,(a2)+        ;'&&'→'&'
  423.     bra    defmacline1
  424.  
  425. defmacline2:
  426.     lea.l    (LOCSYMBUF,a6),a4    ;(仮引数リスト登録バッファ)
  427.     movea.l    a0,a3
  428. defmacline3:
  429.     movea.l    a3,a0
  430.     move.b    (a4)+,d3        ;$FF(仮引数)/$FE(ローカルシンボル)
  431.     beq    defmacline7
  432.     move.b    (a4)+,d4        ;引数/ローカルシンボル番号
  433.     lsl.w    #8,d4
  434.     move.b    (a4)+,d4        ;ローカルシンボル番号のlow
  435. ;macroの中にreptがあったとき困るので省略
  436. ;    tst.w    REPTSKIPNEST(a6)
  437. ;    beq    defmacline4        ;ネストしていない
  438. ;    cmpi.b    #'@',(a4)        ;macroがネストしているとき@~は置換しない
  439. ;    beq    defmacline5
  440. defmacline4:
  441.     bsr    getword            ;登録されている仮引数と比較する
  442. defmacline41:
  443.     cmpm.b    (a0)+,(a4)+
  444.     dbne    d1,defmacline41
  445.     bne    defmacline5
  446.     tst.b    (a4)
  447.     bne    defmacline4        ;(2語以上の仮引数)
  448.     move.b    d3,(a2)+        ;置換すべき仮引数が見つかった
  449.     ror.w    #8,d4
  450.     move.b    d4,(a2)+
  451.     rol.w    #8,d4
  452.     move.b    d4,(a2)+
  453.     bra    defmacline1
  454.  
  455. defmacline5:
  456.     subq.l    #1,a4
  457. defmacline6:
  458.     tst.b    (a4)+
  459.     bne    defmacline6
  460.     bra    defmacline3
  461.  
  462. defmacline7:                ;置換すべき仮引数が見つからなかった
  463.     bsr    getword
  464.     tst.b    (MACMODE,a6)
  465.     bne    defmacline8        ;rept/irp/irpc登録中は無視
  466. ;macroの中にreptがあったとき困るので省略
  467. ;    tst.w    REPTSKIPNEST(a6)
  468. ;    bne    defmacline8        ;ネストの内側の定義中は無視
  469.     cmpi.b    #'@',(a0)
  470.     bne    defmacline8        ;@で始まっていない
  471.     move.b    (1,a0),d0        ;2文字目
  472.     cmp.b    #'@',d0
  473.     beq    defmacline8        ;@@~(これは3文字以上でもキャンセルすること)
  474.     cmp.w    #1,d1            ;単語の長さ-1(単語がないときも0)
  475.     blo    defmacline8        ;1文字しかない
  476.     bhi    defmacline71        ;3文字以上
  477.     or.b    #$20,d0            ;@で始まる2文字のとき2文字目を確認
  478.     cmp.b    #'b',d0
  479.     beq    defmacline8        ;@b
  480.     cmp.b    #'f',d0
  481.     beq    defmacline8        ;@f
  482. defmacline71:
  483. ;@~をローカルシンボルとマクロの本体に登録
  484.     movea.l    (MACDEFEND,a6),a1
  485.     move.l    a6,d0
  486.     add.l    #LOCSYMBUF+LOCSYMBUFSIZE,d0
  487.     cmpa.l    d0,a1
  488.     bcc    defmac_locsymover
  489.     moveq.l    #$FE,d0            ;(ローカルシンボルマーク)
  490.     move.b    d0,(a1)+        ;ローカルシンボルに登録
  491.     move.b    d0,(a2)+        ;マクロの本体に登録
  492.     addq.w    #1,(MACLOCSNO,a6)
  493.     move.b    (MACLOCSNO,a6),(a1)+    ;ローカルシンボル番号
  494.     move.b    (MACLOCSNO+1,a6),(a1)+
  495.     move.b    (MACLOCSNO,a6),(a2)+    ;ローカルシンボル番号
  496.     move.b    (MACLOCSNO+1,a6),(a2)+
  497. defmacline72:
  498.     move.b    (a0)+,(a1)+        ;@~
  499.     dbra    d1,defmacline72
  500.     clr.b    (a1)+
  501.     clr.b    (a1)
  502.     move.l    a1,(MACDEFEND,a6)
  503.     bra    defmacline1
  504.  
  505. defmacline8:
  506.     move.b    (a0)+,(a2)+
  507.     dbra    d1,defmacline8
  508.     bra    defmacline1
  509.  
  510. defmacline9:                ;行が終了
  511.     clr.b    (a2)+
  512.     move.l    a2,(TEMPPTR,a6)
  513.     bra    memcheck
  514.  
  515. defmacstr:                ;文字列の処理
  516.     move.b    d0,d1
  517.     move.b    (a0)+,(a2)+
  518. defmacstr1:
  519.     move.b    (a0)+,d0
  520.     beq    defmacline9        ;文字列の途中で行が終了した
  521.     bmi    defmacstr10
  522.     cmp.b    #'&',d0
  523.     beq    defmacstr3
  524.     move.b    d0,(a2)+
  525.     cmp.b    d0,d1
  526.     bne    defmacstr1
  527.     bra    defmacline1        ;文字列が終了
  528.  
  529. defmacstr3:                ;文字列中の'&~'は置換の対象とする
  530.     lea.l    (LOCSYMBUF,a6),a1    ;(仮引数リスト登録バッファ)
  531. defmacstr4:
  532.     move.b    (a1)+,d2        ;$FF(仮引数)/$FE(ローカルシンボル)
  533.     beq    defmacstr8
  534.     move.b    (a1)+,d3        ;引数/ローカルシンボル番号high
  535.     lsl.w    #8,d3
  536.     move.b    (a1)+,d3        ;low
  537.     movea.l    a0,a3
  538. defmacstr5:                ;登録されている仮引数と比較する
  539.     move.b    (a1)+,d0
  540.     beq    defmacstr9
  541.     cmp.b    (a3)+,d0
  542.     beq    defmacstr5
  543. defmacstr6:
  544.     tst.b    (a1)+
  545.     bne    defmacstr6
  546.     bra    defmacstr4
  547.  
  548. defmacstr8:                ;置換すべき仮引数が見つからなかった
  549.     move.b    #'&',(a2)+
  550.     bra    defmacstr1
  551.  
  552. defmacstr9:                ;置換すべき仮引数が見つかった
  553.     move.b    d2,(a2)+
  554.     ror.w    #8,d3
  555.     move.b    d3,(a2)+        ;high
  556.     rol.w    #8,d3
  557.     move.b    d3,(a2)+        ;low
  558.     movea.l    a3,a0
  559.     bra    defmacstr1
  560.  
  561. defmacstr10:
  562.     move.b    d0,(a2)+
  563.   .if EUCSRC=0
  564.     cmp.b    #$E0,d0
  565.     bcc    defmacstr11
  566.     cmp.b    #$A0,d0
  567.     bcc    defmacstr1        ;半角カナの場合
  568.   .else
  569.     bra    defmacstr1        ;EUC
  570.   .endif
  571. defmacstr11:
  572.     move.b    (a0)+,d0        ;2バイト文字の2バイト目
  573.     beq    defmacline9        ;2バイト目が$00の場合
  574.     move.b    d0,(a2)+
  575.     bra    defmacstr1
  576.  
  577.  
  578. ;----------------------------------------------------------------
  579. ;    マクロ命令のアセンブル処理
  580. ;----------------------------------------------------------------
  581. domacro::
  582.     move.w    #T_MACEXT,d0
  583.     move.b    (CMDOPSIZE,a6),d0    ;オペレーションサイズ
  584.     bsr    wrtobjd0w        ;マクロ展開開始
  585.     movea.l    (CMDTBLPTR,a6),a1
  586.     move.l    a1,d0
  587.     bsr    wrtd0l            ;シンボルテーブルへのポインタ
  588.     move.l    (LINEPTR,a6),d0
  589.     lea.l    (LINEBUF,a6),a0
  590.     sub.l    a0,d0
  591.     bsr    wrtd0w            ;引数へのオフセット
  592.     move.l    a1,-(sp)
  593.     movea.l    (SYM_DEFINE,a1),a0    ;定義内容へのポインタ
  594.     clr.w    d0
  595.     bsr    exmacsetup        ;マクロ展開準備
  596.     movea.l    (sp)+,a1
  597.     move.b    (CMDOPSIZE,a6),(MACSIZE,a6)    ;オペレーションサイズ
  598.     move.w    (SYM_MACLOCS,a1),d0
  599.     add.w    d0,(MACLOCSMAX,a6)
  600.     movea.l    (LINEPTR,a6),a0
  601.     movea.l    (MACPARAEND,a6),a1
  602.     bsr    defmacpara        ;マクロ実引数リストの登録
  603.     move.l    a1,(MACPARAEND,a6)
  604.     rts
  605.  
  606.  
  607. ;----------------------------------------------------------------
  608. ;    マクロ命令展開処理
  609. ;----------------------------------------------------------------
  610.  
  611. ;----------------------------------------------------------------
  612. ;    マクロ展開の準備をする
  613. ;    in :d0.w=繰り返し回数(0ならマクロ)
  614. ;        a0=登録行へのポインタ/a1=実引数リストへのポインタ(irp/irpc展開の場合)
  615. exmacsetup::
  616.     move.w    (MACREPTNEST,a6),d1
  617.     cmp.w    #MACROMAXNEST,d1
  618.     bcc    exmacsetup9        ;マクロのネストが深すぎる
  619.     tst.w    d1
  620.     bne    exmacsetup1
  621.     lea.l    (MACINF,a6),a2        ;最初のマクロ展開の場合
  622.     move.l    a2,(MACINFPTR,a6)
  623.     lea.l    (MACPARABUF,a6),a2
  624.     move.l    a2,(MACPARAPTR,a6)
  625.     move.l    a2,(MACPARAEND,a6)
  626.     clr.b    (a2)
  627. exmacsetup1:
  628.     movea.l    (MACINFPTR,a6),a2    ;それまでの情報を保存する
  629.     move.l    (MACLBGNPTR,a6),(a2)+    ;    展開開始行ポインタ
  630.     move.l    (MACLPTR,a6),(a2)+    ;    現在の展開行ポインタ
  631.     move.l    (MACPARAPTR,a6),(a2)+    ;    実引数バッファポインタ
  632.     move.w    (MACLOCSBGN,a6),(a2)+    ;    ローカルシンボル開始番号
  633.     move.w    (IFNEST,a6),(a2)+    ;    ifネスティングレベル
  634.     move.w    (REPTCOUNT,a6),(a2)+    ;    繰り返し回数
  635.     move.l    (IRPPARAPTR,a6),(a2)+    ;    irp/irpc実引数リストポインタ
  636.     move.b    (MACSIZE,a6),(a2)+    ;
  637.     move.b    (MACCOUNT,a6),(a2)+    ;
  638.     move.l    a2,(MACINFPTR,a6)
  639.     move.l    a0,(MACLPTR,a6)        ;マクロ定義行へのポインタ
  640.     move.l    a0,(MACLBGNPTR,a6)
  641.     addq.w    #1,(MACREPTNEST,a6)
  642.     move.l    (MACPARAEND,a6),(MACPARAPTR,a6)
  643.     move.w    (MACLOCSMAX,a6),(MACLOCSBGN,a6)
  644.     move.w    d0,(REPTCOUNT,a6)
  645.     beq    exmacsetup3
  646. exmacsetup2:
  647.     move.l    a1,d0
  648.     bne    exmacsetup4
  649.     rts                ;rept展開の場合
  650.  
  651. exmacsetup3:                ;マクロ展開の場合
  652.     addq.w    #1,(MACNEST,a6)
  653.     rts
  654.  
  655. exmacsetup4:                ;irp/irpc展開の場合
  656.     movea.l    (MACPARAPTR,a6),a0
  657.     st.b    (a0)+            ;(第一引数)$FF $00 $01
  658.     sf.b    (a0)+
  659.     move.b    #$01,(a0)+
  660.     bsr    strcpy            ;引数リストから1つ得る
  661.     move.l    a1,(IRPPARAPTR,a6)
  662.     addq.l    #1,a0
  663.     clr.b    (a0)
  664.     move.l    a0,(MACPARAEND,a6)
  665.     rts
  666.  
  667. exmacsetup9:                ;マクロ展開を中止してエラー発生
  668.     clr.w    (MACREPTNEST,a6)
  669.     clr.w    (MACNEST,a6)
  670.     bra    macnesterr
  671.  
  672. ;----------------------------------------------------------------
  673. ;    exitm命令の処理
  674. macexexitm0:
  675.     bsr    macexexit        ;それまでにネストしているreptを抜けていく
  676. macexexitm::
  677.     tst.w    (REPTCOUNT,a6)
  678.     bne    macexexitm0
  679.  
  680. ;----------------------------------------------------------------
  681. ;    展開中のマクロのネスティングを1段浅くする
  682. macexexit:
  683.     movea.l    (MACINFPTR,a6),a0
  684.     tst.w    (REPTCOUNT,a6)
  685.     bne    macexexit1
  686.     subq.w    #1,(MACNEST,a6)
  687. macexexit1:
  688.     movea.l    (MACPARAPTR,a6),a1
  689.     move.l    a1,(MACPARAEND,a6)
  690.     clr.b    (a1)
  691.     move.b    -(a0),(MACCOUNT,a6)
  692.     move.b    -(a0),(MACSIZE,a6)
  693.     move.l    -(a0),(IRPPARAPTR,a6)
  694.     move.w    -(a0),(REPTCOUNT,a6)
  695.     move.w    -(a0),(IFNEST,a6)
  696.     move.w    -(a0),(MACLOCSBGN,a6)
  697.     move.l    -(a0),(MACPARAPTR,a6)
  698.     move.l    -(a0),(MACLPTR,a6)
  699.     move.l    -(a0),(MACLBGNPTR,a6)
  700.     move.l    a0,(MACINFPTR,a6)
  701.     subq.w    #1,(MACREPTNEST,a6)
  702.     rts
  703.  
  704. ;----------------------------------------------------------------
  705. ;    マクロ定義行を1行読み込み展開する
  706. macexline::
  707.     movem.l    d1-d3/a0-a2,-(sp)
  708.     movea.l    (MACLPTR,a6),a2
  709.     lea.l    (LINEBUF,a6),a0
  710.     moveq.l    #0,d3
  711. macexline1:
  712.     move.b    (a2)+,d0
  713.     beq    macexline9
  714.     bmi    macexline5
  715.     tst.b    d3
  716.     beq    macexline3
  717.     cmp.b    d0,d3
  718.     bne    macexline2
  719.     moveq.l    #0,d3
  720. macexline2
  721.     move.b    d0,(a0)+
  722.     bra    macexline1
  723.  
  724. macexline3:
  725.     cmp.b    #'%',d0
  726.     beq    macexlsym        ;シンボル値
  727.     cmp.b    #"'",d0
  728.     beq    macexline4
  729.     cmp.b    #'"',d0
  730.     bne    macexline2
  731. macexline4:
  732.     move.b    d0,d3
  733.     bra    macexline2
  734.  
  735. macexline5:
  736.     cmp.b    #$FF,d0
  737.     beq    macexlpara        ;仮引数,終了コード
  738.     cmp.b    #$FE,d0
  739.     beq    macexllocs        ;ローカルシンボル
  740.     move.b    d0,(a0)+
  741.   .if EUCSRC=0
  742.     cmp.b    #$E0,d0
  743.     bcc    macexline6
  744.     cmp.b    #$A0,d0
  745.     bcc    macexline1
  746.   .else
  747.     bra    macexline1        ;EUC
  748.   .endif
  749. macexline6:                ;2バイト文字の場合
  750.     move.b    (a2)+,(a0)+
  751.     bne    macexline1
  752.     subq.l    #1,a0
  753. macexline9:
  754.     clr.b    (a0)+
  755.     move.l    a2,(MACLPTR,a6)
  756.     movem.l    (sp)+,d1-d3/a0-a2
  757.     moveq.l    #0,d0
  758.     rts
  759.  
  760. macexlendm:                ;マクロ定義行の終了
  761.     move.w    (REPTCOUNT,a6),d0
  762.     beq    macexlendm1
  763.     subq.w    #1,d0
  764.     beq    macexlendm1
  765.     move.w    d0,(REPTCOUNT,a6)
  766.     move.l    (MACLBGNPTR,a6),(MACLPTR,a6)    ;reptの次の繰り返しへ
  767.     movea.l    (IRPPARAPTR,a6),a1
  768.     bsr    exmacsetup2        ;irp/irpcなら次の実引数へ
  769.     bra    macexlendm2
  770.  
  771. macexlendm1:
  772.     bsr    macexexit        ;マクロのネスティングが1段浅くなる
  773. macexlendm2:
  774.     movem.l    (sp)+,d1-d3/a0-a2
  775.     moveq.l    #-1,d0
  776.     rts
  777.  
  778. macexlpara:                ;仮引数
  779.     move.b    (a2)+,d1        ;high
  780.     lsl.w    #8,d1
  781.     move.b    (a2)+,d1        ;low
  782.     tst.w    d1
  783.     beq    macexlendm        ;endm行の場合
  784.     bsr    macexlpara0
  785.     tst.b    d0
  786.     beq    macexline1        ;対応する実引数がない
  787.     bsr    strcpy            ;実引数の内容を転送
  788.     bra    macexline1
  789.  
  790. macexlpara0:                ;実引数リストから対応する実引数を検索する
  791.     movem.l    d1-d2,-(sp)
  792.     move.b    d1,d2            ;low
  793.     lsr.w    #8,d1            ;high
  794.     movea.l    (MACPARAPTR,a6),a1
  795.     bra    macexlpara2
  796.  
  797. macexlpara05:
  798.     addq.l    #1,a1
  799. macexlpara1:                ;次の実引数へ
  800.     tst.b    (a1)+
  801.     bne    macexlpara1
  802. macexlpara2:
  803.     move.b    (a1)+,d0
  804.     beq    macexlpara3        ;実引数リストが終了した
  805.     cmp.b    (a1)+,d1        ;high
  806.     bne    macexlpara05
  807.     cmp.b    (a1)+,d2        ;low
  808.     bne    macexlpara1        ;引数番号が違う
  809. macexlpara3:
  810.     movem.l    (sp)+,d1-d2
  811.     rts
  812.  
  813. macexllocs:                ;ローカルシンボル
  814.     move.b    (a2)+,d0        ;high
  815.     lsl.w    #8,d0
  816.     move.b    (a2)+,d0        ;low
  817.     cmp.w    #$FFFE,d0
  818.     bcc    macexllocs3
  819.     move.b    #'?',(a0)+        ;シンボル名を'??xxxx'(xxxx=4桁の16進数)に置換する
  820.     move.b    #'?',(a0)+
  821.     add.w    (MACLOCSBGN,a6),d0
  822.     bsr    convhex4
  823.     bra    macexline1
  824.  
  825. macexllocs3:
  826.     bne    macexllocs1
  827.     moveq.l    #0,d0
  828.     move.b    (MACCOUNT,a6),d0
  829.     moveq.l    #0,d1            ;(左詰め)
  830.     bsr    convdec
  831.     bra    macexline1
  832.  
  833. macexllocs1:
  834.     clr.w    d0
  835.     move.b    (MACSIZE,a6),d0
  836.     bpl    macexllocs2
  837.     move.b    #' ',(a0)+        ;サイズ指定なし
  838.     move.b    #' ',(a0)+
  839.     bra    macexline1
  840.  
  841. macexllocs2:
  842.     move.b    #'.',(a0)+        ;サイズ指定あり
  843.     move.b    (macexllocs9,pc,d0.w),(a0)+
  844.     bra    macexline1
  845.  
  846. macexllocs9:
  847.     .dc.b    'bwlsdxpq'
  848.     .even
  849.  
  850. macexlsym:                ;シンボル値
  851.     exg.l    a0,a2
  852.     tst.b    (ISMACDEF,a6)
  853.     bne    macexlsym9        ;macro/rept/irp/irpcの登録中
  854.     cmpi.b    #$FF,(a0)
  855.     bne    macexlsym1
  856.     move.b    (1,a0),d1        ;仮引数の場合…引数番号を得るhigh
  857.     lsl.w    #8,d1
  858.     move.b    (2,a0),d1        ;low
  859.     bsr    macexlpara0
  860.     tst.b    d0
  861.     beq    macexlsym9        ;対応する引数がない
  862.     move.l    a0,-(sp)
  863.     movea.l    a1,a0
  864.     bsr    strlen
  865.     bsr    isdefdsym        ;その引数はシンボルとして登録されているか?
  866.     movea.l    (sp)+,a0
  867.     bra    macexlsym2
  868.  
  869. macexlsym1:
  870.     bsr    getword            ;'%'の後の語を抜き出す
  871.     tst.w    d2
  872.     bmi    macexlsym9        ;語が抜き出せない
  873.     bsr    isdefdsym        ;その語はシンボルとして登録されているか?
  874. macexlsym2:
  875.     tst.w    d0
  876.     bmi    macexlsym9        ;登録されていない
  877.     tst.b    (SYM_TYPE,a1)        ;cmpi.b #ST_VALUE,(SYM_TYPE,a1)
  878.                     ;数値シンボルか?
  879.     bne    macexlsym9
  880.     cmpi.b    #SA_DEFINE,(SYM_ATTRIB,a1)    ;シンボルは定義済みか?
  881.     blo    macexlsym9
  882.     tst.b    (SYM_SECTION,a1)    ;シンボルは定数か?
  883.     bne    macexlsym9
  884.     exg.l    a0,a2
  885.     move.l    (SYM_VALUE,a1),d0    ;シンボルの値
  886.     moveq.l    #0,d1            ;(左詰め)
  887.     bsr    convdec
  888.     exg.l    a0,a2
  889.     bsr    getword
  890.     movea.l    a1,a0
  891.     exg.l    a0,a2
  892.     bra    macexline1
  893.  
  894. macexlsym9:
  895.     exg.l    a0,a2
  896.     move.b    #'%',(a0)+
  897.     bra    macexline1
  898.  
  899. ;----------------------------------------------------------------
  900. ;    マクロ引数リストを登録する
  901. ;    in :a0=引数リストへのポインタ
  902. ;        a1=引数リス登録バッファへのポインタ
  903. ;    out:a0=引数リスト終了位置へのポインタ
  904. ;        a1=登録後のバッファへのポインタ
  905. defmacpara::
  906.     clr.w    d1
  907.     move.b    (a0),d0
  908.     beq    defmacpara9        ;引数リストがない
  909. defmacpara1:
  910.     st.b    (a1)+            ;(引数マーク)
  911.     addq.w    #1,d1
  912.     ror.w    #8,d1
  913.     move.b    d1,(a1)+        ;high
  914.     rol.w    #8,d1
  915.     move.b    d1,(a1)+        ;low
  916.     bsr    getmacpara        ;$FF [引数番号high,low] パラメータ名~ $00
  917.     tst.w    d0
  918.     bne    defmacpara1
  919. defmacpara9:
  920.     move.b    d1,(MACCOUNT,a6)    ;マクロの引数の個数
  921.     clr.b    (a1)
  922.     rts
  923.  
  924. ;----------------------------------------------------------------
  925. ;    マクロ引数リスト1つを得る
  926. ;    in :a0=引数リストへのポインタ/a1=引数バッファへのポインタ
  927. ;    out:d0.l=0ならその引数で終了
  928. getmacpara::
  929.     cmpi.b    #'<',(a0)        ;'<~>'文字列をそのまま通す
  930.     beq    getmacparars
  931.     moveq.l    #0,d3            ;'(~)','[~]','{~}'のネスティング
  932. getmacpara0:
  933.     move.b    (a0)+,d0
  934.     move.b    d0,(a1)+        ;区切りがくるまで転送する
  935.     bmi    getmacpara2
  936.     cmp.b    #"'",d0            ;'~',"~"は文字列
  937.     beq    getmacparastr
  938.     cmp.b    #'"',d0
  939.     beq    getmacparastr
  940.     cmp.b    #'(',d0            ;括弧の始まり
  941.     beq    getmacparapb
  942.     cmp.b    #'[',d0
  943.     beq    getmacparapb
  944.     cmp.b    #'{',d0
  945.     beq    getmacparapb
  946.     cmp.b    #')',d0            ;括弧の終わり
  947.     beq    getmacparape
  948.     cmp.b    #']',d0
  949.     beq    getmacparape
  950.     cmp.b    #'}',d0
  951.     beq    getmacparape
  952.     cmp.b    #'%',d0            ;シンボル値
  953.     beq    getmacparasym
  954.     cmp.b    #'!',d0            ;1文字をそのまま通す
  955.     beq    getmacpararc
  956.     cmp.b    #',',d0
  957.     beq    getmacpara1
  958.     cmp.b    #' ',d0
  959.     bhi    getmacpara0
  960.     bra    getpara1
  961.  
  962. getmacpara1:
  963.     tst.w    d3
  964.     beq    getpara5
  965.     bra    getmacpara0
  966.  
  967. getmacpara2:
  968.   .if EUCSRC=0
  969.     cmp.b    #$E0,d0
  970.     bcc    getmacpara3
  971.     cmp.b    #$A0,d0
  972.     bcc    getmacpara0        ;半角カナの場合
  973.   .else
  974.     bra    getmacpara0        ;EUC
  975.   .endif
  976. getmacpara3:
  977.     move.b    (a0)+,d0        ;2バイト文字の2バイト目
  978.     move.b    d0,(a1)+
  979.     bne    getmacpara0
  980.     bra    getpara1        ;2バイト目が$00の場合
  981.  
  982. getmacparastr:                ;文字列の処理
  983.     move.b    (a0)+,d2
  984.     move.b    d2,(a1)+
  985.     beq    getmacparastr01        ;行が終わってしまった
  986.     bmi    getmacparastr1
  987.     cmp.b    d2,d0
  988.     bne    getmacparastr
  989.     bra    getmacpara0
  990.  
  991. getmacparastr1:
  992.   .if EUCSRC=0
  993.     cmp.b    #$E0,d2
  994.     bcc    getmacparastr2
  995.     cmp.b    #$A0,d2
  996.     bcc    getmacparastr        ;半角カナの場合
  997.   .else
  998.     bra    getmacparastr        ;EUC
  999.   .endif
  1000. getmacparastr2:
  1001.     move.b    (a0)+,d2        ;2バイト文字の2バイト目
  1002.     move.b    d2,(a1)+
  1003.     bne    getmacparastr
  1004.     bra    iloprerr        ;2バイト目が$00の場合
  1005.  
  1006. getmacparastr01:
  1007.     cmp.b    #"'",d0
  1008.     beq    termerr_singlequote
  1009.     bra    termerr_doublequote
  1010.  
  1011. getmacparapb:                ;括弧の始まり
  1012.     addq.w    #1,d3
  1013.     bra    getmacpara0
  1014.  
  1015. getmacparape:                ;括弧の終わり
  1016.     subq.w    #1,d3
  1017.     bcc    getmacpara0
  1018.     moveq.l    #0,d3            ;')',']','}'の数が多かった
  1019.     bra    getmacpara0
  1020.  
  1021. getmacpararc:
  1022.     move.b    (a0)+,d0        ;'!'のあとの1文字はそのまま通す
  1023.     move.b    d0,(-1,a1)
  1024.     beq    iloprerr        ;'!'で行が終了した
  1025.     bpl    getmacpara0
  1026.   .if EUCSRC=0
  1027.     cmp.b    #$E0,d0
  1028.     bcc    getmacpararc1
  1029.     cmp.b    #$A0,d0
  1030.     bcc    getmacpara0        ;半角カナの場合
  1031.   .else
  1032.     bra    getmacpara0        ;EUC
  1033.   .endif
  1034. getmacpararc1:
  1035.     move.b    (a0)+,d0        ;2バイト文字の2バイト目
  1036.     move.b    d0,(a1)+
  1037.     bne    getmacpara0
  1038.     bra    iloprerr        ;2バイト目が$00の場合
  1039.  
  1040. getmacparasym:                ;シンボル値
  1041.     movem.l    d1/a1,-(sp)
  1042.     bsr    getword            ;'%'の後の語を抜き出す
  1043.     tst.w    d2
  1044.     bmi    getmacparasym9        ;語が抜き出せない
  1045.     bsr    isdefdsym        ;その語はシンボルとして登録されているか?
  1046.     tst.w    d0
  1047.     bmi    getmacparasym9        ;登録されていない
  1048.     tst.b    (SYM_TYPE,a1)        ;cmpi.b #ST_VALUE,(SYM_TYPE,a1)
  1049.                     ;数値シンボルか?
  1050.     bne    getmacparasym9
  1051.     cmpi.b    #SA_DEFINE,(SYM_ATTRIB,a1)    ;シンボルは定義済みか/
  1052.     blo    getmacparasym9
  1053.     tst.b    (SYM_SECTION,a1)    ;シンボルは定数か?
  1054.     bne    getmacparasym9
  1055.     move.l    (SYM_VALUE,a1),d0    ;シンボルの値
  1056.     moveq.l    #0,d1            ;(左詰め)
  1057.     movea.l    a0,a1
  1058.     movea.l    (4,sp),a0
  1059.     subq.l    #1,a0
  1060.     bsr    convdec
  1061.     move.l    a0,(4,sp)        ;数値の終了位置
  1062.     movea.l    a1,a0
  1063.     bsr    getword
  1064.     movea.l    a1,a0
  1065. getmacparasym9:
  1066.     movem.l    (sp)+,d1/a1
  1067.     bra    getmacpara0
  1068.  
  1069. getmacparars:                ;'<~>'の間の文字列はそのまま通す
  1070.     addq.l    #1,a0
  1071. getmacparars1:
  1072.     move.b    (a0)+,d0
  1073. getmacparars2:
  1074.     move.b    d0,(a1)+
  1075.     beq    termerr_bracket        ;対応する'>'がないまま行が終了した
  1076.     bmi    getmacparars3
  1077.     cmp.b    #'>',d0
  1078.     bne    getmacparars1
  1079.     move.b    (a0)+,d0
  1080.     cmp.b    #',',d0
  1081.     beq    getpara5        ;文字列が'>'で終了し、次のパラメータがある
  1082.     cmp.b    #' ',d0
  1083.     bhi    getmacparars2        ;'>'の後に文字が続くときは終端記号でない
  1084.     bra    getpara1
  1085.  
  1086. getmacparars3:
  1087.   .if EUCSRC=0
  1088.     cmp.b    #$E0,d0
  1089.     bcc    getmacparars4
  1090.     cmp.b    #$A0,d0
  1091.     bcc    getmacparars1        ;半角カナの場合
  1092.   .else
  1093.     bra    getmacparars1        ;EUC
  1094.   .endif
  1095. getmacparars4:
  1096.     move.b    (a0)+,d0        ;2バイト文字の2バイト目
  1097.     move.b    d0,(a1)+
  1098.     bne    getmacparars1
  1099.     bra    iloprerr
  1100.  
  1101. ;----------------------------------------------------------------
  1102. ;    引数リストを登録する
  1103. ;    in :a0=引数リストへのポインタ
  1104. ;        a1=引数リス登録バッファへのポインタ
  1105. ;    out:a0=引数リスト終了位置へのポインタ
  1106. ;        a1=登録後のバッファへのポインタ
  1107. defpara::
  1108.     clr.w    d1
  1109.     move.b    (a0),d0
  1110.     beq    defpara9        ;引数リストがない
  1111. defpara1:
  1112.     st.b    (a1)+            ;(引数マーク)
  1113.     addq.w    #1,d1            ;引数番号は1~
  1114.     ror.w    #8,d1
  1115.     move.b    d1,(a1)+        ;high
  1116.     rol.w    #8,d1
  1117.     move.b    d1,(a1)+        ;low
  1118.     bsr    getpara            ;$FF [引数番号high,low] パラメータ名~ $00
  1119.     tst.w    d0
  1120.     bne    defpara1
  1121. defpara9:
  1122.     clr.b    (a1)
  1123.     rts
  1124.  
  1125. ;----------------------------------------------------------------
  1126. ;    引数リスト1つを得る
  1127. ;    in :a0=引数リストへのポインタ/a1=引数バッファへのポインタ
  1128. ;    out:d0.l=0ならその引数で終了
  1129. getpara::
  1130.     move.b    (a0)+,d0
  1131.     move.b    d0,(a1)+        ;区切りがくるまで転送する
  1132.     bmi    getpara2
  1133.     cmp.b    #',',d0
  1134.     beq    getpara5
  1135.     cmp.b    #' ',d0
  1136.     bhi    getpara
  1137. getpara1:
  1138.     clr.b    (-1,a1)
  1139.     subq.l    #1,a0
  1140.     bsr    skipspc
  1141.     moveq.l    #-1,d0
  1142.     cmp.b    #',',(a0)+
  1143.     bne    getpara9
  1144.     bra    skipspc            ;まだ引数が続く
  1145.  
  1146. getpara9:
  1147.     moveq.l    #0,d0
  1148.     rts
  1149.  
  1150. getpara2:
  1151.   .if EUCSRC=0
  1152.     cmp.b    #$E0,d0
  1153.     bcc    getpara3
  1154.     cmp.b    #$A0,d0
  1155.     bcc    getpara            ;半角カナの場合
  1156.   .else
  1157.     bra    getpara            ;EUC
  1158.   .endif
  1159. getpara3:
  1160.     move.b    (a0)+,d0        ;2バイト文字の2バイト目
  1161.     move.b    d0,(a1)+
  1162.     bne    getpara
  1163.     bra    getpara1        ;2バイト目が$00の場合
  1164.  
  1165. getpara5:
  1166.     clr.b    (-1,a1)
  1167.     moveq.l    #-1,d0
  1168.     bra    skipspc            ;まだ引数が続く
  1169.  
  1170.  
  1171. ;----------------------------------------------------------------
  1172.     .end
  1173.  
  1174. ;----------------------------------------------------------------
  1175. ;    $Log: macro.s,v $
  1176. ;    Revision 2.2  1999 10/ 8(Fri) 21:51:41 M.Kamada
  1177. ;    +86 EUC対応準備
  1178. ;
  1179. ;    Revision 2.1  1999  4/28(Wed) 22:21:13 M.Kamada
  1180. ;    +84 マクロ内のローカルシンボルが多すぎるとバスエラーが出る不具合を修正
  1181. ;    +84 1つのマクロでローカルシンボルを254個以上登録できる
  1182. ;
  1183. ;    Revision 2.0  1999  3/ 2(Tue) 20:20:23 M.Kamada
  1184. ;    +82 エラーメッセージを日本語化
  1185. ;    +82 skiphasspcを廃止
  1186. ;
  1187. ;    Revision 1.9  1999  2/27(Sat) 23:42:25 M.Kamada
  1188. ;    +81 ソースリストのフォーマットを変更(実行ファイルは+80とまったく同じ)
  1189. ;
  1190. ;    Revision 1.8  1998  8/26(Wed) 13:26:52 M.Kamada
  1191. ;    +76 マクロ内ローカルシンボル@~を2個以上定義すると誤動作する
  1192. ;
  1193. ;    Revision 1.7  1998  8/21(Fri) 03:14:51 M.Kamada
  1194. ;    +74 マクロ定義中の@~を自動的にローカル宣言する
  1195. ;
  1196. ;    Revision 1.6  1998  8/18(Tue) 20:03:08 M.Kamada
  1197. ;    +72 .sizemの第2引数のローカルシンボルにマクロの引数の個数を定義する
  1198. ;
  1199. ;    Revision 1.5  1998  1/24(Sat) 22:07:35 M.Kamada
  1200. ;    +57 疑似命令.sizemを追加
  1201. ;
  1202. ;    Revision 1.4  1997  9/15(Mon) 15:58:48 M.Kamada
  1203. ;    +46 ST_VALUE=0で最適化
  1204. ;
  1205. ;    Revision 1.3  1997  9/15(Mon) 03:58:42 M.Kamada
  1206. ;    +45 マクロ名$oprcntでパラメータ数,マクロ名$opsizeでサイズ指定を参照,shift新設
  1207. ;
  1208. ;    Revision 1.2  1997  6/24(Tue) 22:01:14 M.Kamada
  1209. ;    +34 プレデファインシンボルに対応
  1210. ;
  1211. ;    Revision 1.1  1994/02/13  14:38:38  nakamura
  1212. ;    Initial revision
  1213. ;
  1214. ;
  1215.